//src/utils/request.js
//该文件是用来二次封装 axios 用的
import axios from 'axios'


//开发环境(写代码的阶段)  development
//生产环境(代码已经写好,已经部署到服务器了) production       
//测试环境(代码已经写好了,但是还没有部署) production  

//process.env.NODE_ENv用来获取我们当前的环境
const isDev = process.env.NODE_ENV == 'development'

// 创建一个请求对象
const request = axios.create({
  // `baseURL` 将自动加在 `url` 前面，除非 `url` 是一个绝对 URL。
  // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
  // baseURL: isDev ? 'http://121.89.205.189:3000/admin' : '' ,
  baseURL: 'http://121.89.205.189:3000/admin',
  // `timeout` 指定请求超时的毫秒数。一般我们写60000,也就是一分钟
  // 如果请求时间超过 `timeout` 的值，则请求会被中断
  timeout: 60000, // 默认值是 `0` (永不超时)

})






// 添加请求拦截器
request.interceptors.request.use(function (config) {

  // 在发送请求之前做些什么,此处用于保存token.避免每一次发送请求都要携带token
  // console.log(localStorage.getItem('token'));
  // 1.先获取token
  const token = localStorage.getItem('token')
  // 2.设置 token
  config.headers.token = token

  return config;
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});



// 添加响应拦截器
request.interceptors.response.use(function (response) {
  // 2xx 范围内的状态码都会触发该函数。
  // 对响应数据做点什么

  // console.log(response.data.code);
  if(response.data.code === '10119'){
    //token无效,之后我们可以重新登陆
    localStorage.clear()
    location.href = '/#/login'
  }
  return response.data;
}, function (error) {
  // 超出 2xx 范围的状态码都会触发该函数。
  // 对响应错误做点什么
  return Promise.reject(error);
});




// ========================================================================================================

// ==========================================================================================================

//ajax 自定义各种数据请求的方法
export default function ajax(config) {
  //1.先获取到请求的一些必要参数
  const {
    url = '', method = 'GET', data = {}, headers = {}
  } = config
  //2.判断我们请求的类型是get还是post还是其他
  switch (method.toUpperCase) {
    // =================================================================
    case 'GET':
      //get请求
      //get请求的参数我们需要放在params中
      return request.get(url, {
        params: data
      })
      // ==============================================================
    case 'POST':
      //post请求

      // 1.表单提交数据
      if (headers['content-type'] == 'application/x-www-form-url-encoded') {
        //如果提交的是表单数据我们需要格式化数据
        const obj = new URLSearchParams()
        for (const key in data) {
          obj.append(key, data[key])
        }
        return request.post(url, obj, {
          headers
        })
      }
      // 2.文件数据
      if (headers['content-type'] == 'multipart/form-data') {
        //如果提交的是表单数据我们需要格式化数据
        const obj = new FormData()
        for (const key in data) {
          obj.append(key, data[key])
        }
        return request.post(url, obj, {
          headers
        })

      }
      // 3.json数据
      return request.post(url, data)

      // ==================================================================

    case 'PUT':
      //通常用来修改数据用的 --- 数据更新

      return request.put(url, data)
    case 'DELETE':
      //删除数据

      return request.delete(url, {
        data
      })
    case 'PATCH':
      //更新局部资源

      return request.patch(url, data)


    default:
      // 如果前面全部都不是
      return request.request(config)
  }



}